import axios from './axios'

// 创建axios实例并配置默认参数
const instance = axios.create({
  baseURL: import.meta.env.VITE_BASE_URL, // 基础URL，从环境变量获取
  timeout: 10000, // 请求超时时间10秒
  headers: {'X-Custom-Header': 'foobar'} // 自定义请求头
});

// 请求计数器，用于控制加载提示的显示/隐藏
let num = 0

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求前统一添加Authorization头
    config.headers.Authorization = 'Bearer ' + localStorage.getItem('accessToken')
    
    // 增加请求计数
    num++
    
    // 如果有请求正在进行，显示加载提示（假设id为'box'的元素是加载提示）
    if(num > 0) {
      let box = document.getElementById('box')
      box.style.display = 'block'
    }
    
    return config
  }, 
  function (error) {
    // 请求错误处理
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  async function (response) {
    // 成功响应处理（状态码在2xx范围内）
    
    // 减少请求计数
    num--
    
    // 如果所有请求都完成了，隐藏加载提示
    if(num < 1) {
      let box = document.getElementById('box')
      box.style.display = 'none'     
    }
    
    // 处理业务代码非200的情况
    if(response.data.code !== 200) {
      // 304 缓存命中
      if(response.data.code == 304) {
        return Promise.reject('有缓存')
      } 
      // 401 token过期
      else if(response.data.code == 401) {
        // 无感刷新token流程
        const res = await refreshTokenfun() // 调用刷新token接口
        const accessToken = res.data.data.accessToken // 获取新的accessToken
        localStorage.setItem('accessToken', accessToken) // 更新本地存储
        response.config.headers.Authorization = "Bearer " + accessToken // 更新请求头
        return request(response.config) // 重新发起原请求
      } 
      // 403 无权限
      else if(response.data.code == 403) {
        return Promise.reject('暂无权限')
      } 
      // 404 请求失败
      else if(response.data.code == 404) {
        return Promise.reject('请求失败')
      } 
      // 500 服务器错误
      else if(response.data.code == 500) {
        return Promise.reject('服务器错误')
      }
    }
    
    // 延迟1秒关闭加载提示（假设loadingInstance是加载组件实例）
    setTimeout(() => {
      loadingInstance.value.close()
    }, 1000)
    return response
  },
  function (error) {
    // 响应错误处理（状态码超出2xx范围）
    return Promise.reject(error)
  }
)
// 刷新token的函数
const refreshTokenfun = () => {
  // 调用刷新token接口，传入refreshToken参数
  return request.get('/refreshToken', {
    params: {
      refreshToken: localStorage.getItem('refreshToken')
    }
  })
}

export default instance